package com.unju.ventanas.responsable;

import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

import com.unju.hibernate.entidades.Responsable;
import com.unju.hibernate.patronDAO.imp.ResponsableDAOImpl;
import com.unju.hibernate.patronDAO.imp.UsuarioDAOImp;
import com.unju.utils.ConstantesGlobales;
import com.unju.ventanas.principal.JFrmPrincipal;
import com.unju.ventanas.proyecto.JPNuevoProyecto;

import javax.swing.JButton;

import org.apache.log4j.Logger;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.ListSelectionModel;

import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class JDBuscarResponsable extends JDialog {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5291167529566428268L;
	final static Logger logger = Logger.getLogger(JDBuscarResponsable.class);
	static public JDBuscarResponsable jdagregarResponsable;

	private JTable table;
	private JTextField textField;
	private ArrayList<Responsable> listaResponsables;
	private ButtonGroup opcionesBusqueda;
	private JRadioButton rdbtnNombre;
	private JRadioButton rdbtnApellido;
	private JRadioButton rdbtnDNI;
	private JButton btnAgregar;
	private JButton btnTerminado;
	private DefaultTableModel modelo;
	private int regSeleccionado;
	private Responsable responsable = null;
	private Object idCapturado;
	private boolean seleccionado;

	/**
	 * Create the dialog.
	 * 
	 * Tipos de Perfiles para agregar: 1 Administrador 2 Consultor 3 Lider
	 */
	//
	// static public JDBuscarResponsable getInstance() {
	// if (jdagregarResponsable == null)
	// jdagregarResponsable = new JDBuscarResponsable(
	// JFrmPrincipal.getInstance());
	// return jdagregarResponsable;
	// }

	public JDBuscarResponsable() {
		super.setTitle(ConstantesGlobales.BUSCAR_RESPONSABLE);
		setSize(540, 380);
		setBounds(100, 100, 462, 341);
		getContentPane().setLayout(null);
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		setLocationRelativeTo(null);
		setModal(true);	
		
		setSeleccionado(false);
		
		JPanel panel = new JPanel();
		panel.setLayout(null);
		panel.setBounds(0, 0, 446, 258);
		getContentPane().add(panel);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 74, 426, 173);
		panel.add(scrollPane);
		table = new JTable();
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		scrollPane.setViewportView(table);
		table.setSurrendersFocusOnKeystroke(true);
		table.setModel(new DefaultTableModel(new Object[][] {}, new String[] {
				"Id", "Apellido", "Nombre", "DNI" }));
		table.getColumnModel().getColumn(1).setResizable(false);
		table.getColumnModel().getColumn(2).setResizable(false);

		table.addMouseListener(new MouseAdapter() {

			public void mouseClicked(MouseEvent e) {

				int fila = table.rowAtPoint(e.getPoint());
				int columna = table.columnAtPoint(e.getPoint());
				if ((fila > -1) && (columna > -1)) {

					// logger.info(""+modelo.getValueAt(fila,columna));
					idCapturado = table.getValueAt(fila,0);
					//idCapturado = modelo.getValueAt(fila, 0);
					int id = Integer.parseInt(idCapturado.toString());
					responsable = new ResponsableDAOImpl().get(id);
					logger.info("idCapturado: " + idCapturado);
				}
			}
		});

		textField = new JTextField();
		textField.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				if (rdbtnDNI.isSelected()) {
					ConstantesGlobales.validarNumero(e);
				}
			}

			@Override
			public void keyPressed(KeyEvent e) {
				String cadena = "";
				cadena = textField.getText();
				cargarTabla(cadena);
			}

			@Override
			public void keyReleased(KeyEvent e) {

				String cadena = "";
				cadena = textField.getText();
				cargarTabla(cadena);
			}
		});
		textField.setColumns(20);
		textField.setBounds(68, 11, 306, 20);
		panel.add(textField);
		{
			{
				{

					{
						JLabel lblBuscarPor = new JLabel("Buscar por:");
						lblBuscarPor.setBounds(12, 49, 78, 14);
						panel.add(lblBuscarPor);
					}

					rdbtnNombre = new JRadioButton("Nombre");
					rdbtnNombre.setBounds(175, 44, 78, 23);
					panel.add(rdbtnNombre);

					rdbtnApellido = new JRadioButton("Apellido");
					rdbtnApellido.setBounds(89, 44, 72, 23);
					rdbtnApellido.setSelected(true);
					panel.add(rdbtnApellido);

					rdbtnDNI = new JRadioButton("DNI");
					rdbtnDNI.setBounds(255, 45, 109, 23);
					panel.add(rdbtnDNI);

					opcionesBusqueda = new ButtonGroup();
					opcionesBusqueda.add(rdbtnApellido);
					opcionesBusqueda.add(rdbtnNombre);
					opcionesBusqueda.add(rdbtnDNI);
					logger.info("antes de cargar funciona");

				}
			}
		}

		btnAgregar = new JButton(ConstantesGlobales.BTN_AGREGAR);
		btnAgregar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// TODO
				/**
				 * Se debe obtener el dato seleccionado de la tabla y agregarlo
				 * a la lista
				 */

				// if(regSeleccionado > -1){
				// //
				// responsablesList.add(pAgregarResponsable.getResponsable());
				// modelo.getValueAt(fila,columna);
				//
				// setResponsable(new ResponsableDAOImpl().get());
				// logger.info("registro seleccionado: "+responsable.getApellido());
				// }
				if (!responsable.equals(null)) {
					textField.setText("");
					setSeleccionado(true);
					dispose();
				}else{
					logger.info("responsable no ha sido cargado");
				}
			}
		});
		btnAgregar.setBounds(240, 269, 95, 23);
		getContentPane().add(btnAgregar);

		btnTerminado = new JButton(ConstantesGlobales.BTN_CANCELAR);
		btnTerminado.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setSeleccionado(false);
				dispose();
			}
		});
		btnTerminado.setBounds(345, 269, 89, 23);
		getContentPane().add(btnTerminado);
		
		
	}

	public Responsable getResponsable() {
		return responsable;
	}

	public void setResponsable(Responsable responsable) {
		this.responsable = responsable;
	}

	protected void cargarTabla(String cadena) {

		if (rdbtnApellido.isSelected()) {
			listaResponsables = new ResponsableDAOImpl()
					.findByLastNameUser(cadena);
			logger.info("busqueda por apellido");
		}

		if (rdbtnNombre.isSelected()) {
			listaResponsables = new ResponsableDAOImpl().findByName(cadena);
			logger.info("busqueda por nombre");
		}

		if (rdbtnDNI.isSelected() && !textField.getText().equals("")) {
			listaResponsables = new ResponsableDAOImpl().findByDni(Integer
					.parseInt(cadena));
			logger.info("busqueda por dni");
		}
		// else{
		// listaResponsables = (ArrayList<Responsable>) new
		// ResponsableDAOImpl().getAll();
		// }
		modelo = (DefaultTableModel) table.getModel();
		modelo.setRowCount(0);// <-- with this line, the table is cleaned
		Object[] fila = new Object[modelo.getColumnCount()];

		recorrerTabla(fila, modelo);
	}

	public void cargarTabla() {
		listaResponsables = (ArrayList<Responsable>) new ResponsableDAOImpl()
				.getAll();
		DefaultTableModel modelo = (DefaultTableModel) table.getModel();
		Object[] fila = new Object[modelo.getColumnCount()];
		recorrerTabla(fila, modelo);
	}

	private void recorrerTabla(Object[] fila, DefaultTableModel modelo) {
		for (int i = 0; i < listaResponsables.size(); i++) {
			fila[0] = listaResponsables.get(i).getIdResponsable();
			fila[1] = listaResponsables.get(i).getApellido();
			fila[2] = listaResponsables.get(i).getNombre();
			fila[3] = listaResponsables.get(i).getDni();
			modelo.addRow(fila);
		}
	}

	public int getRegSeleccionado() {
		return regSeleccionado;
	}

	public void setRegSeleccionado(int regSeleccionado) {
		this.regSeleccionado = regSeleccionado;
	}

	public boolean isSeleccionado() {
		return seleccionado;
	}

	public void setSeleccionado(boolean seleccionado) {
		this.seleccionado = seleccionado;
	}

}
